<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Beacon</title>
<style>
   pre.idl { border:solid thin; background:#eee; color:#000; padding:0.5em }
   pre.idl :link, pre.idl :visited { color:inherit; background:transparent }
   pre code { color:inherit; background:transparent }
   div.example { margin-left:1em; padding-left:1em; border-left:double; color:#222; background:#fcfcfc }
   .note { margin-left:2em; font-weight:bold; font-style:italic; color:#008000 }
   p.note::before { content:"Note: " }
   .XXX { padding:.5em; border:solid #f00 }
   p.XXX::before { content:"Issue: " }
   dl.switch { padding-left:2em }
   dl.switch > dt { text-indent:-1.5em }
   dl.switch > dt:before { content:'\21AA'; padding:0 0.5em 0 0; display:inline-block; width:1em; text-align:right; line-height:0.5em }
   dl.domintro { color: green; margin: 2em 0 2em 2em; padding: 0.5em 1em; border: none; background: #DDFFDD; }
   dl.domintro dt, dl.domintro dt * { color: black; text-decoration: none; }
   dl.domintro dd { margin: 0.5em 0 1em 2em; padding: 0; }
   dl.domintro dd p { margin: 0.5em 0; }
   dl.domintro:before { display: table; margin: -1em -0.5em -0.5em auto; width: auto; content: 'This box is non-normative. Implementation requirements are given below this box.'; color: red; border: solid 2px; background: white; padding: 0 0.25em; }
   div.parameters{ display:block; margin-left: 25px;}
   div.returnvalues{ display:block; margin-left: 25px;}
   .ednote { border-top: 3px solid red; border-bottom: 3px solid red; margin: 1em 2em; padding: 0 1em 0 1em; background: #f8eeee }
   .ednoteHeader { font-weight: bold; display: block; padding-top: 0.5em }
   em.ct { text-transform:lowercase; font-variant:small-caps; font-style:normal }
   dfn { font-weight:bold; font-style:normal }
   code { color:orangered }
   code :link, code :visited { color:inherit }
   hr:not(.top) { display:block; background:none; border:none; padding:0; margin:2em 0; height:auto }
   table { border-collapse:collapse; border-style:hidden hidden none hidden }
   table thead { border-bottom:solid }
   table tbody th:first-child { border-left:solid }
   table td, table th { border-left:solid; border-right:solid; border-bottom:solid thin; vertical-align:top; padding:0.2em }
  .auto-style1 { background-color: #FFFFFF;}
  .ednote { border-top: 3px solid red; border-bottom: 3px solid red; margin: 1em 2em; padding: 0 1em 0 1em; background: #f8eeee }
  .ednoteHeader { font-weight: bold; display: block; padding-top: 0.5em }
  .element {background: #F4F4FA; color: black; margin: 0 0 1em 0.15em; padding: 0 1em 0.25em 0.75em; border-left: solid #9999FF 0.25em; position: relative; z-index: 1; }
  </style>
  <link href="https://www.w3.org/StyleSheets/TR/W3C-ED.css" rel="stylesheet" type="text/css">
</head>

<body class="draft">

<div class="head">
<h1>Beacon</h1>

<h2 class="no-num no-toc" id="editors-draft-february-12-2014">Editor's Draft February 12, 2014</h2>
<dl>
  <dt>This version:</dt>
    <dd><a
      href="http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/Beacon/Overview.html">http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/Beacon/Overview.html</a></dd>

  <dt>Latest published version:</dt>
    <dd><a
      href="http://www.w3.org/TR/beacon/">http://www.w3.org/TR/beacon/</a></dd>

  <dt>Editors:</dt>
    <dd class="vcard"><span class="fn">Arvind Jain</span>, <span 
      class="org">Google Inc.</span>, &lt;<a
      class="email" href="mailto:arvind@google.com">arvind@google.com</a>&gt; </dd>
    <dd class="vcard"><span class="fn">Jatinder Mann</span>, <span
      class="org">Microsoft Corp.</span>, &lt;<a
      class="email" href="mailto:jmann@microsoft.com">jmann@microsoft.com</a>&gt; 
      <i>(Until February 2014)</i></dd>
</dl>

    <p class=copyright><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a>
    &copy; 2013 <a href="http://www.w3.org/"><abbr title="World Wide
    Web Consortium">W3C</abbr></a><sup>&reg;</sup>
    (<a href="http://www.csail.mit.edu/"><abbr title="Massachusetts
    Institute of
    Technology">MIT</abbr></a>, <a href="http://www.ercim.eu/"><abbr title="European
    Research Consortium for Informatics and
    Mathematics">ERCIM</abbr></a>, <a href="http://www.keio.ac.jp/">Keio</a>, <a href="http://ev.buaa.edu.cn/">Beihang</a>),
    All Rights
    Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>,
    <a
    href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a>

    and <a
    href="http://www.w3.org/Consortium/Legal/copyright-documents">document
    use</a> rules apply.</p>

   <hr class='top'>
</div>

<h2 class="no-num no-toc" id="abstract">Abstract</h2>

<p>
    This specification defines an interoperable means for site developers to asynchronously transfer 
    small HTTP data from the User Agent to a web server. 
</p>

<h2 class="no-num no-toc" id="status-of-this-document">Status of this
document</h2>

  <p><em>This section describes the status of this document at the time of
   its publication. Other documents may supersede this document. A list of
   current W3C publications and the latest revision of this technical report
   can be found in the <a href="http://www.w3.org/TR/">W3C technical reports
   index</a> at http://www.w3.org/TR/.</em></p>

<p>This is an <strong>editor's draft</strong> and may change without any
notices. </p>

<p>Please send comments
   to <a href="mailto:public-web-perf@w3.org?subject=%5BBeacon%5D%20">public-web-perf@w3.org</a>
   (<a href="http://lists.w3.org/Archives/Public/public-web-perf/">archived</a>)
   with <samp>[Beacon]</samp> at the start of the subject line.</p>

<p>This document is produced by
   the <a href="http://www.w3.org/2010/webperf/">Web Performance</a>
   Working Group.</p>


<h2 class="no-num no-toc" id="table-of-contents">Table of Contents</h2>
<!--begin-toc-->
<ol class="toc">
  <li><a href="#introduction"><span class="secno">1
  </span>Introduction</a></li>
  <li><a href="#conformance-requirements"><span class="secno">2
    </span>Conformance requirements</a></li>
  <li><a href="#terminology"><span class="secno">3 </span>Terminology</a></li>
  <li><a href="#sec-beacon"><span class="secno">4 </span>Beacon</a> 
    <ol class="toc">
      <li><a href="#sec-beacon-introduction"><span class="secno">4.1 </span>Introduction</a></li>
      <li><a href="#sec-sendBeacon-method"><span class="secno">4.2 </span><code>sendBeacon</code> Method</a></li>
      <li><a href="#sec-processing-model"><span class="secno">4.3 </span>Processing Model</a></li>
    </ol>
  </li>
  <li><a href="#references"><span class="secno">6 </span>References</a></li>
  <li><a class="no-num" href="#acknowledgements">Acknowledgements</a></li>
</ol>
<!--end-toc-->

<h2 id="introduction"><span class="secno">1 </span>Introduction</h2>

<p>This section is non-normative.</p>

<p>
    The Beacon specification defines an interface that web developers can use to asynchronously transfer 
    small HTTP data from the User Agent to a web server.
</p>

<p>
    The specification addresses the needs of analytics and diagnostics code that typically attempt to send data to a web server prior to the unloading
    of the document. Sending the data any sooner may result in a missed opportunity to gather data. However,
    ensuring that the data has been sent during the unloading of a document is something that has 
    traditionally been difficult for developers.
</p>
<p>
    User agents will typically ignore asynchronous XMLHttpRequests made in an unload handler. To solve this problem,
    analytics and diagnostics code will typically make a synchronous XMLHttpRequest in an unload or beforeunload handler to submit
    the data. The synchronous XMLHttpRequest forces the User Agent to delay unloading the document, and makes the 
    next navigation appear to be slower. There is nothing the next page can do to avoid this perception of poor page 
    load performance.
</p>

<p> 
    There are other techniques used to ensure that data is submitted. One such technique is to delay
    the unload in order to submit data by creating an Image element and setting its <code>src</code> attribute within 
    the unload handler. As most user agents will delay the unload to complete the pending image load, data can be 
    submitted during the unload. Another technique is to create a no-op loop for several seconds within the 
    unload handler to delay the unload and submit data to a server.
</p>

<p>
    Not only do these techniques represent poor coding patterns, some of them are unreliable and also result in the 
    perception of poor page load performance for the next navigation.
</p>

<div class="example">
    <p>
        The following example shows a theoretical analytics code that attempts to submit data to a server by
        using a synchronous XMLHttpRequest in an unload handler. This results in the unload of the page to be delayed.
    </p>
<pre>
window.addEventListener('unload', logData, false);

function logData() {
    var client = new XMLHttpRequest();
    client.open("POST", "/log", false); // third parameter indicates sync xhr
    client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
    client.send(analyticsData);
}
</pre>
</div>
<p>
    Using the <a href="#dom-BeaconHTTPMethod-sendBeacon"><code>sendBeacon</code></a> method, the data will be transmitted asynchronously 
    to the web server when the User Agent has had an opportunity to do so, without delaying the unload or 
    affecting the performance of the next navigation.
</p>
 
<div class="example">
<p>
    The following example shows a theoretical analytics code pattern that submits data to a server using the by
    using the <a href="#dom-BeaconHTTPMethod-sendBeacon"><code>sendBeacon</code></a> method.
</p>
<pre>
window.addEventListener('unload', logData, false);

function logData() {
    navigator.sendBeacon("/log", analyticsData);
}
</pre>
</div>

<h2 id="conformance-requirements"><span class="secno">2 </span>Conformance
requirements</h2>

<p>All diagrams, examples, and notes in this specification are non-normative,
as are all sections explicitly marked non-normative. Everything else in this
specification is normative. </p>

<p>The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT",
"RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document
are to be interpreted as described in <a href="#rfc2119">RFC 2119</a>.
For readability, these words do not appear in all uppercase letters in this specification.</p>

<p>Requirements phrased in the imperative as part of algorithms (such as
"strip any leading space characters" or "return false and abort these steps")
are to be interpreted with the meaning of the key word ("must", "should",
"may", etc) used in introducing the algorithm. </p>

<p>Some conformance requirements are phrased as requirements on attributes,
methods or objects. Such requirements are to be interpreted as requirements
on user agents. </p>

<p>Conformance requirements phrased as algorithms or specific steps may be
implemented in any manner, so long as the end result is equivalent. (In
particular, the algorithms defined in this specification are intended to be
easy to follow, and not intended to be performant.) </p>

    <p>The IDL fragments in this specification must be interpreted as
    required for conforming IDL fragments, as described in the Web IDL
    specification. <a href="#WebIDL">[Web IDL]</a></p>

<h2 id="terminology"><span class="secno">3 </span>Terminology</h2>

<p>The construction "a <code title="">Foo</code> object", where <code
title="">Foo</code> is actually an interface, is sometimes used instead of
the more accurate "an object implementing the interface <code
title="">Foo</code>". </p>

<p>
    The terms <dfn id="origin">origin</dfn> and <dfn id="same-origin">same origin</dfn>
    are defined by The HTTP Origin Header. <a href="#rfc6454">[IETF RFC 6454]</a>
</p>


<h2 id="sec-beacon"><span class="secno">4 <span class="auto-style1">Beacon</span></span></h2>

<h3 id="sec-beacon-introduction"><span class="secno">4.1 </span>Introduction</h3>

<p>This section is non-normative.</p>

<p>
    This specification defines an interoperable means for site developers to asynchronously transfer 
    small HTTP data from the User Agent to a web server.
</p>

<h3 id="sec-sendBeacon-method"><span class="secno">4.2 </span><code>sendBeacon</code> Method</h3>
  

<pre class="idl">
partial interface <dfn id="Navigator">Navigator</dfn> {
    boolean <a href="#dom-send-beacon">sendBeacon</a>(DOMString <var title="url">url</var>, optional (<a class="external" href="http://www.khronos.org/registry/typedarray/specs/latest/#ARRAYBUFFERVIEW">ArrayBufferView</a> or <a class="external" href="http://dev.w3.org/2006/webapi/FileAPI/#blob">Blob</a> or DOMString or <a href="#formdata">FormData</a>)? <var>data</var> = null);
};

partial interface <dfn id="WorkerNavigator">WorkerNavigator</dfn> {
    boolean <a href="#dom-send-beacon">sendBeacon</a>(DOMString <var title="url">url</var>, optional (<a class="external" href="http://www.khronos.org/registry/typedarray/specs/latest/#ARRAYBUFFERVIEW">ArrayBufferView</a> or <a class="external" href="http://dev.w3.org/2006/webapi/FileAPI/#blob">Blob</a> or DOMString or <a href="#formdata">FormData</a>)? <var>data</var> = null);
};
</pre>

<p>
  The <a href="#sendBeacon"><code>sendBeacon</code></a> method MUST asynchronously transmit data provided by the <a href="#data-parameter"><code>data</code></a> parameter to the resolved <a href="http://www.w3.org/TR/html5/urls.html#resolve-a-url">URL</a> provided by the <a href="#url-parameter"><code>url</code></a> parameter. The User Agent MUST use the <code>POST</code> <a href="http://tools.ietf.org/html/rfc2616#section-5.1.1">HTTP method</a> to <a href="http://www.w3.org/TR/html5/infrastructure.html#fetch">fetch</a> the <a href="#url-parameter"><code>url</code></a> for transmitting the data. All relevant cookie headers MUST be included in the request. User agents MUST honor the HTTP headers (including, in particular, redirects and HTTP cookie headers), but MUST ignore any entity bodies returned in the response. User agents MAY close the connection prematurely once they start receiving an entity body. The User Agent SHOULD transmit data at the earliest available opportunity, but MAY prioritize the transmission of data lower compared to other network traffic. The User Agent SHOULD make a best effort attempt to eventually transmit the data. To avoid the target confusion security risk, the User Agent MUST NOT display HTTP authorization prompts as a result of a <a href="#sendBeacon"><code>sendBeacon</code></a> method call.
</p>

<div class="parameters"><h4 id="parameters">Parameters</h4>
    <h4 id="url-parameter"><code>url</code></h4>
    <p>
        The <code>url</code> parameter indicates the resolved <a href="http://www.w3.org/TR/html5/urls.html#resolve-a-url">URL</a>
        where the data is to be transmitted.
    </p>

    <h4 id="data-parameter"><code>data</code></h4>
    <p>
        The <code>data</code> parameter is the <a class="external" href="http://www.khronos.org/registry/typedarray/specs/latest/#ARRAYBUFFERVIEW">ArrayBufferView</a>,
        <a class="external" href="http://dev.w3.org/2006/webapi/FileAPI/#blob">Blob</a>,
        DOMString, or <a href="#formdata">FormData</a> data that is to be transmitted.
    </p>
    
</div>

<div class="returnvalues"><h4 id="return-values">Return Value</h4>
    <p>
        The <a href="#sendBeacon"><code>sendBeacon</code></a> method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.
    </p>

    <div class="note">
    <div class="noteHeader">Note</div>
    <p>
        If the User Agent limits the amount of data that can be queued to be sent using this API and the size of
        <var title="">data</var> causes that limit to be exceeded, this method returns false. A return value of true
        implies the browser has queued the data for transfer. However, since the actual data
        transfer happens asynchronously, this method does not provide any information whether the data transfer has
        succeeded or not. The actual
        data transfer may occur after the page has unloaded. To be still an effective mechanism for
        developers, the User Agent should
        make the best effort to transmit the data including making multiple attempts to transmit the
        data in presence of transient network or server errors, even though it uses POST to transmit the data.
    </p>
    </div>
</div>

<h3 id="sec-processing-model"><span class="secno">4.3 </span>Processing Model</h3>

  <p>
      On calling the <a href="#dom-BeaconHTTPMethod-sendBeacon"><code>sendBeacon</code></a> method, the following steps must be run:
  </p>

  <ol>
   <li><p>Set <var title="">base</var> to the <a class="external" href="http://www.w3.org/TR/html5/webappapis.html#entry-settings-object">entry setting object's</a>
     <a class="external" href="http://www.w3.org/TR/html5/webappapis.html#api-base-url">API base URL</a>.

   <li><p>Set source origin to the <a class="external" href="http://www.w3.org/TR/html5/webappapis.html#entry-settings-object">entry setting object's</a>
     <a class="external" href="http://www.w3.org/TR/html5/browsers.html#origin">origin</a>.



   <li><p>Let <var title="">url</var> be a
   <a class="external" href="http://www.w3.org/TR/html5/infrastructure.html#url">URL</a> with character encoding UTF-8.

   <li><p><a class="external" href="http://www.w3.org/TR/html5/infrastructure.html#resolve-a-url" title="Resolve a URL">Resolve</a>
   <var title="">url</var> relative to <var title="">base</var>. If the algorithm
   returns an error,
   <a class="external" href="http://www.w3.org/TR/dom/#concept-throw" title="concept-throw">throw</a> a
   "<code class="external"><a href="http://www.w3.org/TR/dom/#syntaxerror">SyntaxError</a></code>" exception and terminate
   these steps.
    
   <li><p>If <var>data</var> is not null and if the user agent limits the amount of data that can be queued to be sent using this API and the size of <var title="">data</var> causes that limit to be exceeded, terminate
   these steps and set the return value to false.</p>

   <li>
    <p>Otherwise, create the following temporary variable and then follow the rules below: let <var>encoding</var> be null, <var>mime type</var> be
    null, and <var>transmittedData</var> be null.</p>

    <dl class="switch">

     <dt>If <var>data</var> is a <code class="external"><a href="http://www.khronos.org/registry/typedarray/specs/latest/#ArrayBuffer">ArrayBuffer</a></code></dt>
     <dd><p>Let the <var>transmittedData</var> be the raw data
     represented by <var>data</var>.</dd>

     <dt>If <var>data</var> is a <code class="external"><a href="http://www.w3.org/TR/FileAPI/#blob">Blob</a></code></dt>

     <dd>
      <p>If the object's
      <code class="external" title="dom-Blob-type"><a href="http://www.w3.org/TR/FileAPI/#dfn-BPtype">type</a></code>
      attribute is not the empty string let <var>mime type</var> be its
      value.</p>

      <p>Let <var>transmittedData</var> be the raw data represented by <var>data</var>.</p>
     </dd>


     <dt>If <var>data</var> is a string</dt>

     <dd>
      <p>Let <var>encoding</var> be UTF-8.</p>

      <p>Let <var>mime type</var> be "<code>text/plain;charset=UTF-8</code>".</p>

      <p>Let the <var>transmittedData</var>  be <var>data</var>
      <a class="external" href="http://www.w3.org/TR/WebIDL/#dfn-obtain-unicode" title="convert a DOMString to a sequence of Unicode characters">converted to Unicode</a>
      and encoded as UTF-8.</p>
     </dd>


     <dt>If <var>data</var> is a <code><a href="http://www.w3.org/TR/XMLHttpRequest/#formdata">FormData</a></code></dt>

     <dd>
      <p>Let <var>transmittedData</var> be the result of running
      the
      <a class="external" href="http://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm"><code>multipart/form-data</code> encoding algorithm</a>
      with <var>data</var> as <var>form data set</var> and with UTF-8 as the
      explicit character encoding.</p>

      <p>Let <var>mime type</var> be the concatenation of
      "<code title="">multipart/form-data;</code>",
      a U+0020 SPACE character,
      "<code title="">boundary=</code>", and the
      <a class="external" href="http://www.w3.org/TR/html5/forms.html#multipart/form-data-boundary-string"><code>multipart/form-data</code> boundary string</a>
      generated by the
      <a class="external" href="http://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm"><code>multipart/form-data</code> encoding algorithm</a>.
     </dd>

    </dl>

    <li>
        Set the return value to true and return the <code>sendBeacon()</code> call, but continue to runs the following steps. These steps may be run
        even after the document has unloaded.
    </li>
    
   <li>
       <p>
           If <var>url</var> is of the same <a href="#origin">origin</a> as <var>base</var>, 
            <a href="http://www.w3.org/TR/html5/infrastructure.html#fetch">fetch</a> <var>url</var>
            from the <var>base origin</var> using the <code>POST</code> <a href="http://tools.ietf.org/html/rfc2616#section-5.1.1">HTTP method</a>
            with <var>transmittedData</var>, <var>encoding</var>, and <var>mime type</var>.
        </p>
        <p>
            Otherwise, make a <a class="external" href="http://www.w3.org/TR/cors/#cross-origin-request">cross-origin request</a> to <var>url</var>,
            using the <code>POST</code> <a href="http://tools.ietf.org/html/rfc2616#section-5.1.1">HTTP method</a>
            with <var>transmittedData</var>, <var>encoding</var>, and <var>mime type</var>.
      </p>
   </li>
</ol>
<h2 id="references"><span class="secno">6 </span>References</h2>

<dl>
    <dt id="refsCORS">[CORS]</dt>
    <dd><cite><a href="http://www.w3.org/TR/cors/">Cross-Origin
    Resource Sharing</a></cite>, Anne van Kesteren, Editor. World Wide
    Web Consortium, January 2013. This version of the CORS
    specification is available from http://www.w3.org/TR/cors/.</dd>

    <dt id="refsDOM">[DOM]</dt>

    <dd><cite><a href="http://www.w3.org/TR/dom/">DOM4</a></cite>,
    Anne van Kesteren, Editor. World Wide Web Consortium, December
    2012. This version of the DOM4 specification is available from
    http://www.w3.org/TR/dom/.</dd>

   <dt id="rfc2119">[IETF RFC 2119]</dt>
   <dd>
    <cite><a href="http://www.ietf.org/rfc/rfc2119.txt">Key words for use in RFCs to Indicate Requirement Levels</a></cite>,
    Scott Bradner, Author. Internet Engineering Task Force, March 1997. Available at
    <a href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt</a>.
   </dd>

<dt>[<a id="rfc6454">IETF RFC 6454</a>]</dt>
<dd>
 <cite><a href="http://tools.ietf.org/html/rfc6454">The Web Origin Concept</a></cite>, Adam Barth, Author.  Internet Engineering Task Force, December 2011. Available at <a href="http://www.ietf.org/rfc/rfc6454.txt">http://www.ietf.org/rfc/rfc6454.txt</a>. 
</dd>

   <dt id="HTML5">[HTML5]</dt>
   <dd><cite><a href='http://www.w3.org/TR/html5/'>HTML5</a></cite>, Robin Berjon, et al, Editors. World Wide Web Consortium, August 2013. This version of the HTML5 is available from <a href='http://www.w3.org/TR/html5/'>http://www.w3.org/TR/html5/</a>. The latest editor's draft of the HTML is available from <a href='http://www.w3.org/html/wg/drafts/html/master/'>latest editor's draft</a> is available at http://www.w3.org/html/wg/drafts/html/master/.</dd>

    <dt>[<a id="XHR">XMLHttpRequest</a>]</dt>
    <dd>
     <cite><a href='http://www.w3.org/TR/XMLHttpRequest/'>XMLHttpRequest</a></cite>,
     Anne van Kesteren, Author. World Wide Web Consortium, December
     2012. This version of the XMLHttpRequest specification
     is
     http://www.w3.org/TR/XMLHttpRequest/. The <a class="normative"
     href="http://www.w3.org/TR/XMLHttpRequest/">latest version of
     XMLHttpRequest</a> is available at
     http://www.w3.org/TR/XMLHttpRequest/.
    </dd>

   <dt>[<a id="WebIDL">Web IDL</a>]</dt>
   <dd><cite><a href='http://www.w3.org/TR/2012/CR-WebIDL-20120419/'>Web IDL</a></cite>, Cameron McCormack, Editor. World Wide Web Consortium, April 2012. This version of the Web IDL specification is available from http://www.w3.org/TR/2012/CR-WebIDL-20120419/. The <a href='http://www.w3.org/TR/WebIDL/'>latest version of Web IDL</a> is available at http://www.w3.org/TR/WebIDL/.</dd>
    <dt id="refsTYPEDARRAY">[TYPEDARRAY]
    <dd><cite><a href="http://www.khronos.org/registry/typedarray/specs/latest/">Typed Array</a></cite>, David Herman and Kenneth Russell. Khronos.

</dl>

  <h2 id="acknowledgements">Acknowledgements</h2>

  <p>
    We would like to sincerely thank Jonas Sicking, Ilya Grigorik, James Simonsen, William Chan, Jason Weber, Philippe Le Hegaret, Daniel Austin, Chase Douglas, and others who have helped refine this specification to acknowledge their contributions to this work.
  </p>


</body>
</html>
